home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / madtrb34.arc / MSTACK.PAS < prev    next >
Pascal/Delphi Source File  |  1986-04-06  |  3KB  |  83 lines

  1.   {
  2.   demonstrates how to move Turbo's stack segment down at
  3.   run time. Compile your program with $A000 paragraphs
  4.   of maximum heap, then call the procedure LOWERSTACK from the
  5.   main block before doing any heap storage operations.
  6.  
  7.   Adjust the constant PARASTORESERVE in LOWERSTACK to free up
  8.   any number of paragraphs above Turbo. PARASTORESERVE=1300
  9.   (decimal) is enough to guarantee that COMMAND.COM will not
  10.   be reloaded after execution finishes. Larger values of
  11.   PARASTORESERVE may be desirable if the Turbo program is
  12.   using the DOS EXEC function to start up additional processes
  13.   or command processors during execution.
  14.  
  15.   Written 10/12/85. Kim Kokkonen, TurboPower Software.
  16.   (408)378-3672. Compuserve 72457,2131.
  17.   }
  18.  
  19. PROGRAM mstack;
  20.     {-demonstrate moving Turbo's stack down to leave free paragraphs above}
  21.  
  22.   PROCEDURE lowerstack;
  23.       {-free up some memory above Turbo}
  24.     TYPE
  25.       registers = RECORD
  26.                     CASE Integer OF
  27.                       1 : (ax, bx, cx, dx, bp, si, di, ds, es, flags : Integer);
  28.                       2 : (al, ah, bl, bh, cl, ch, dl, dh : Byte);
  29.                   END;
  30.     CONST
  31.       {set the following to whatever you want}
  32.       parastoreserve = 4096;  {64K bytes in this case}
  33.       {the procedure initializes the value of the rest}
  34.       retadd : Integer = 0;   {return address temporarily goes here}
  35.       newstackseg : Integer = 0;
  36.       parastokeep : Integer = 0;
  37.       reg : registers =
  38.       (ax : 0; bx : 0; cx : 0; dx : 0; bp : 0;
  39.       si : 0; di : 0; ds : 0; es : 0; flags : 0);
  40.     BEGIN
  41.       {get number of available paragraphs}
  42.       reg.ah := $4A;
  43.       reg.es := CSeg;
  44.       reg.bx := $A000;
  45.       MsDos(reg);
  46.       {calculate new segment boundaries}
  47.       parastokeep := reg.bx-parastoreserve;
  48.       newstackseg := SSeg-parastoreserve;
  49.       {move stack down}
  50.       INLINE(
  51.         $8B/$46/$02/          {MOV AX,[BP+02] - gets procedure return address}
  52.         $2E/$A3/retadd/       {MOV cs:retadd,AX}
  53.         $2E/$8E/$16/newstackseg/ {MOV SS,cs:newstackseg}
  54.         $2E/$A1/retadd/       {MOV AX,cs:retadd}
  55.         $89/$46/$02/          {MOV [BP+02],AX}
  56.         $8B/$C5/              {MOV AX,BP}
  57.         $89/$46/$00/          {MOV [BP+00],AX}
  58.         $8B/$E5/              {MOV SP,BP}
  59.         $55                   {PUSH BP}
  60.         );
  61.       {shrink allocated memory}
  62.       reg.ah := $4A;
  63.       reg.es := CSeg;
  64.       reg.bx := parastokeep;
  65.       MsDos(reg);
  66.     END;                      {lowerstack}
  67.  
  68.   FUNCTION cardinal(i : Integer) : Real;
  69.       {-return an unsigned 16 bit integer}
  70.     VAR
  71.       r : Real;
  72.     BEGIN
  73.       r := i;
  74.       IF r < 0.0 THEN r := r+65536.0;
  75.       cardinal := r;
  76.     END;                      {cardinal}
  77.  
  78.   BEGIN
  79.     WriteLn('SSEG:',cardinal(SSeg):0:0, ' MEMAVAIL:', cardinal(MemAvail):0:0);
  80.     lowerstack;
  81.     WriteLn('SSEG:',cardinal(SSeg):0:0, ' MEMAVAIL:', cardinal(MemAvail):0:0);
  82.   END.
  83.